package de.htw.ejb.model;

import de.htw.ejb.model.listener.ArtikelMonitor;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;

/**
 * Diese Klasse implementiert die datentechnische Darstellung eines Artikels.
 * 
 * @author Thomas Schoenfeld
 * @version 20130318-01
 */
@EntityListeners( ArtikelMonitor.class )
@Entity
@NamedQueries( {
		@NamedQuery( name = "selectAlleArtikel", query = "SELECT a FROM Artikel a" ),
		@NamedQuery( name = "selectArtikelByArtikelnummer", query = "SELECT a FROM Artikel a WHERE a.artikelnummer = :artikelnummer" ),
		@NamedQuery( name = "selectArtikelByName", query = "SELECT a FROM Artikel a WHERE a.bezeichnung = :bezeichnung" )

} )
public class Artikel implements Serializable
{
	public static final String	SELECT_ALLE_ARTIKEL			= "selectAlleArtikel";
	public static final String	SELECT_BY_ARTIKELNUMMER	= "selectArtikelByArtikelnummer";
	public static final String	SELECT_BY_BEZEICHNUNG		= "selectArtikelByName";
	
	// Parameter Aliase
	public static final String	ARTIKELNUMMER						= "artikelnummer";
	public static final String	KATEGORIE								= "kategorie";
	public static final String	BEZEICHNUNG							= "bezeichnung";
	public static final String	PREIS										= "preis";
	
	private static final long		serialVersionUID				= 1L;
	
	@Id
	@GeneratedValue( strategy = GenerationType.AUTO )
	@Column( name = "id" )
	private int									artikelnummer;
	private int									kategorie;
	private double							preis;
	private String							bezeichnung;
	
	public Artikel () {}
	
	public int getArtikelnummer()
	{
		return artikelnummer;
	}
	
	public void setArtikelnummer( int artikelnummer )
	{
		this.artikelnummer = artikelnummer;
	}
	
	public int getKategorie()
	{
		return kategorie;
	}
	
	public void setKategorie( int kategorie )
	{
		this.kategorie = kategorie;
	}
	
	public double getPreis()
	{
		return preis;
	}
	
	public void setPreis( double preis )
	{
		this.preis = preis;
	}
	
	public String getBezeichnung()
	{
		return bezeichnung;
	}
	
	public void setBezeichnung( String bezeichnung )
	{
		this.bezeichnung = bezeichnung;
	}
	
	@Override
	public String toString()
	{
	    String lineSeparator = System.getProperty("line.separator");
	    String ausgabe="Artikel:		"+lineSeparator+
	    			   "Name:			"+this.getBezeichnung()+lineSeparator+
	    			   "Artikelnummer   "+this.getArtikelnummer()+lineSeparator+
	    			   "Preis:			"+this.getPreis();
	    				
		
		return ausgabe;
	}
	
	@Override
	public int hashCode()
	{
		final int prime = 31;
		int result = 1;
		result = prime * result + artikelnummer;
		result = prime * result
				+ ( ( bezeichnung == null ) ? 0 : bezeichnung.hashCode() );
		result = prime * result + kategorie;
		long temp;
		temp = Double.doubleToLongBits( preis );
		result = prime * result + ( int ) ( temp ^ ( temp >>> 32 ) );
		return result;
	}
	
	@Override
	public boolean equals( Object obj )
	{
		if ( this == obj )
			return true;
		if ( obj == null )
			return false;
		if ( getClass() != obj.getClass() )
			return false;
		Artikel other = ( Artikel ) obj;
		if ( artikelnummer != other.artikelnummer )
			return false;
		if ( bezeichnung == null )
		{
			if ( other.bezeichnung != null )
				return false;
		}
		else if ( !bezeichnung.equals( other.bezeichnung ) )
			return false;
		if ( kategorie != other.kategorie )
			return false;
		if ( Double.doubleToLongBits( preis ) != Double
				.doubleToLongBits( other.preis ) )
			return false;
		return true;
	}
}